#include "stack.h"

bool InitStack(SqStack &S)
{
	S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!S.base)
		exit(-1);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return true;
}

bool DestoryStack(SqStack &S)
{
	if(S.base)
		free(S.base);
	S.base = NULL;
	S.top = NULL;
	return true;
}

bool ClearStack(SqStack &S)
{
	if(S.base != S.top)
		S.top = S.base;
	return true;
}

bool StackEmpty(SqStack S)
{
	return S.top == S.base;
}

int StackLength(SqStack S)
{
	return (S.top - S.base);
}

bool GetTop(SqStack S, SElemType &e)
{
	if(S.top == S.base)
		return false;
	e = *(S.top-1);
	return true;
}

bool Push(SqStack &S, SElemType e)
{
	if(S.top - S.base >= S.stacksize) 
	{
		S.base = (SElemType*) realloc(S.base,
				(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)
			exit(-1);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e;
	return true;
}

bool Pop(SqStack &S, SElemType &e)
{
	if(S.top == S.base)
		return false;

	e = *--S.top;
	return true;
}



